package api

import (
	"batbat-backend/app/model"
	"batbat-backend/app/service"
	"batbat-backend/library/response"
	"github.com/gogf/gf/errors/gerror"
	"github.com/gogf/gf/frame/g"
	"github.com/gogf/gf/net/ghttp"
)

// GameReview 游戏评论API接口
var GameReview = gameReviewApi{}

type gameReviewApi struct{}

// GetGameReviews
// @summary 获取游戏评论
// @tags    游戏评论
// @param 	id path int true "待获取评论的游戏的id"
// @param	pn query int false "页码"
// @param	limit query int false "页面大小, 取值范围5~10"
// @produce json
// @success 200 {object} response.JsonResponse{data=model.GameReviewApiGetGameReviewsResp}
// @router  /game/{id}/review [GET]
func (gr *gameReviewApi) GetGameReviews(r *ghttp.Request) {
	var req *model.GameReviewApiGetGameReviewsReq
	err := r.Parse(&req)
	if err != nil {
		response.Error(r, err)
	}
	resp, err := service.GameReview.GetGameReviews(r.Context(), req.Id, req.Pn, req.Limit)
	if err != nil {
		response.Error(r, err)
	}
	response.Success(r, resp)
}

// NewGameReview
// @summary 新增对游戏的评论
// @tags    游戏评论
// @param 	Authorization header string true "token"
// @param 	id path int true "所评论的游戏id"
// @param	content formData string true "评论内容"
// @param	score formData int true "评分"
// @produce json
// @success 200 {object} response.JsonResponse{data=model.GameReviewDetail}
// @router  /game/{id}/review [POST]
func (gr *gameReviewApi) NewGameReview(r *ghttp.Request) {
	var req *model.GameReviewApiNewGameReviewReq
	err := r.Parse(&req)
	if err != nil {
		response.Error(r, err)
	}
	review, err := service.GameReview.NewGameReview(r.Context(), req.Id, req.Content, req.Score)
	if err != nil {
		response.Error(r, err)
	}
	response.Success(r, review)
}

// DeleteGameReview
// @summary 删除对游戏的评论
// @tags    游戏评论
// @param 	Authorization header string true "token"
// @param 	id path int true "要删除的评论的游戏id"
// @produce json
// @success 200 {object} response.JsonResponse{data=bool}
// @router  /game/{id}/review [DELETE]
func (gr *gameReviewApi) DeleteGameReview(r *ghttp.Request) {
	// 获取要删除的评论的游戏id
	id := r.GetUint("id")
	if id == 0 {
		response.Error(r, gerror.New("路径参数有误, 请检查参数`id`"))
	}
	// 获取用户上下文
	var user *model.UserContext
	err := r.GetCtxVar(model.UserContextKey).Scan(&user)
	if err != nil {
		g.Log().Ctx(r.Context()).Errorf("获取用户上下文发生错误: %v", err)
		response.Error(r, gerror.New("删除评论失败"))
	}
	// 删除评论
	err = service.GameReview.DeleteGameReview(r.Context(), user.Id, id)
	if err != nil {
		response.Error(r, err)
	}
	response.Success(r, true)
}

// Up
// @summary 给游戏评论点赞
// @tags    游戏评论
// @param 	Authorization header string true "token"
// @param 	id path int true "游戏id"
// @param	rid path int true "评论id"
// @produce json
// @success 200 {object} response.JsonResponse{data=bool} "点赞成功会返回true"
// @router  /game/{id}/review/{rid}/up [POST]
func (gr *gameReviewApi) Up(r *ghttp.Request) {
	var req *model.GameReviewApiUpReq
	err := r.Parse(&req)
	if err != nil {
		response.Error(r, err)
	}
	err = service.GameReview.Up(r.Context(), req.Id, req.Rid)
	if err != nil {
		response.Error(r, err)
	}
	response.Success(r, true)
}

// UnUp
// @summary 取消给游戏评论的点赞
// @tags    游戏评论
// @param 	Authorization header string true "token"
// @param 	id path int true "游戏id"
// @param	rid path int true "评论id"
// @produce json
// @success 200 {object} response.JsonResponse{data=bool} "取消点赞成功会返回true"
// @router  /game/{id}/review/{rid}/up [DELETE]
func (gr *gameReviewApi) UnUp(r *ghttp.Request) {
	var req *model.GameReviewApiUpReq
	err := r.Parse(&req)
	if err != nil {
		response.Error(r, err)
	}
	err = service.GameReview.UnUp(r.Context(), req.Id, req.Rid)
	if err != nil {
		response.Error(r, err)
	}
	response.Success(r, true)
}
